/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.saber.certificacao.beansjsf.cadastro;

import br.com.saber.certificacao.beansjsf.interfacebean.BeanJSFInterface;
import br.com.saber.certificacao.beansjsf.login.LoginManager;
import br.com.saber.certificacao.beansjsf.semescopo.SelectItemManager;
import br.com.saber.certificacao.ejbs.stateless.interfaces.QuestaoBeanLocal;
import br.com.saber.certificacao.enums.Papeis;
import br.com.saber.certificacao.modelos.Certificacao;
import br.com.saber.certificacao.modelos.Questao;
import br.com.saber.certificacao.modelos.Resposta;
import br.com.saber.certificacao.modelos.Versao;
import br.com.saber.certificacao.modelos.validadores.exceptions.generica.ValidacaoExcecao;
import br.com.saber.certificacao.observador.ControleObserver;
import br.com.saber.certificacao.utils.UtilMetodos;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author gbvbahia
 */
@ManagedBean(name = "cadastroQuestao")
@ViewScoped
public class QuestaoManager implements BeanJSFInterface {
    @EJB
    private QuestaoBeanLocal questaoBean;

    private Questao questaoCadastrada;

    private Versao versao;

    private Certificacao certificacao;

    private int maxRespostas = 8;

    private int minRespostas = 4;

    private Integer respostasQtdade;

    private boolean questDefinida = false;

    @ManagedProperty("#{loginManager}")
    private LoginManager loginManager;

    @ManagedProperty("#{selectItemManager}")
    private SelectItemManager selectItemManager;

    /** Creates a new instance of QuestaoManager */
    public QuestaoManager() {
    }

    //====================
    // Iniciadores
    //====================
    @Override
    @PostConstruct
    public void init() {
        this.certificacao = null;
        this.versao = null;
        this.respostasQtdade = null;
        this.questDefinida = false;
        questaoCadastrada = new Questao();
        //questaoCadastrada.setEnunciado("\n<pre class=\"brush: java;\">\n</pre>");
        questaoCadastrada.setProfessorResponsavel(this.loginManager.getUsuario());
        Logger.getLogger(this.getClass().getName()).log(Level.FINEST, "QuestaoManager.init() executado!");
    }

    @Override
    @PreDestroy
    public void end() {
        Logger.getLogger(this.getClass().getName()).log(Level.FINEST, "QuestaoManager.end() executado!");
    }

    //====================
    //Métodos de Negócio
    //====================
    public void salvarQuestao(ActionEvent event) {
        try {
            List<Versao> v = new ArrayList<Versao>();
            v.add(versao);
            this.questaoBean.salvarQuestao(questaoCadastrada, v);
            init();
            ControleObserver.notificaObservers(this.loginManager.getUsuario(), new String[]{ControleObserver.Eventos.CAD_QUESTAO_EVENT});
            UtilMetodos.messageFactoringFull("questaoCadastradaOK", FacesMessage.SEVERITY_INFO, FacesContext.getCurrentInstance());
        } catch (ValidacaoExcecao e) {
            if (!StringUtils.isBlank(e.getAtributoName())) {
                UtilMetodos.messageFactoringFull(UtilMetodos.getResourceBundle(e.getMessage(), FacesContext.getCurrentInstance()),null,e.getAtributoName(), FacesMessage.SEVERITY_ERROR, FacesContext.getCurrentInstance());
            } else {
                UtilMetodos.messageFactoringFull(e.getMessage(), FacesMessage.SEVERITY_ERROR, FacesContext.getCurrentInstance());
            }
        }
    }


      public void atualizaRespostas(ActionEvent event) {
        List<Resposta> resposta = new ArrayList<Resposta>(questaoCadastrada.getRespostas());
        if ((resposta.size() < this.respostasQtdade)) {
            for (int i = resposta.size(); i < this.respostasQtdade; i++) {
                Resposta res = new Resposta();
                res.setQuestao(questaoCadastrada);
                res.setOrdem(i + 1);
                resposta.add(res);
            }
        } else if (resposta.size() > this.respostasQtdade) {
            for (int i = resposta.size(); i > this.respostasQtdade; i--) {
                resposta.remove(i - 1);
            }
        }
        questaoCadastrada.setRespostas(new TreeSet<Resposta>(resposta));
        alternarQuestaoResposta(event);
    }

     public void alternarQuestaoResposta(ActionEvent event){
        this.questDefinida = !this.questDefinida;
    }
     
    //====================
    //Table Actions
    //====================
     
    //====================
    //SelectItem
    //====================
    public List<SelectItem> getCertificacoes() {
        if(this.loginManager.getUsuario().getMaxRole().getPapel().equals(Papeis.PROFESSOR)){
            return this.selectItemManager.getLazyCertificacoes(loginManager.getUsuario());
        }
        return this.selectItemManager.getCertificacoes(this.loginManager.getUsuario());
    }

    public List<SelectItem> getVersoes() {
        return this.selectItemManager.getVersoes(this.loginManager.getUsuario(), certificacao, false);
    }

    public List<SelectItem> getLinguagens(){
        return this.selectItemManager.getLinguagens();
    }

    public List<SelectItem> getTipoQuestoes(){
        return this.selectItemManager.getTipoQuestoes();
    }

    public List<SelectItem> getQuantidadeRespostas() {
        return this.selectItemManager.getQuantidade(minRespostas, maxRespostas);
    }

    public List<String> shooser(String like){
         return this.selectItemManager.shooser(like, certificacao);
     }
    
    //=========================
    //Getters AND Setters
    //=========================
    public LoginManager getLoginManager() {
        return loginManager;
    }

    public void setLoginManager(LoginManager loginManager) {
        this.loginManager = loginManager;
    }

    public SelectItemManager getSelectItemManager() {
        return selectItemManager;
    }

    public void setSelectItemManager(SelectItemManager selectItemManager) {
        this.selectItemManager = selectItemManager;
    }

    public Certificacao getCertificacao() {
        return certificacao;
    }

    public void setCertificacao(Certificacao certificacao) {
        this.certificacao = certificacao;
    }

    public Versao getVersao() {
        return versao;
    }

    public void setVersao(Versao versao) {
        this.versao = versao;
    }

    public Questao getQuestaoCadastrada() {
        return questaoCadastrada;
    }

    public void setQuestaoCadastrada(Questao questaoCadastrada) {
        this.questaoCadastrada = questaoCadastrada;
    }

    public Integer getRespostasQtdade() {
        return respostasQtdade;
    }

    public void setRespostasQtdade(Integer respostasQtdade) {
        this.respostasQtdade = respostasQtdade;
    }

    public List<Resposta> getRespostas() {
        return new ArrayList<Resposta>(questaoCadastrada.getRespostas());
    }

    public void setRespostas(List<Resposta> respostas) {
        this.questaoCadastrada.setRespostas(new TreeSet<Resposta>(respostas));
    }

    public boolean isQuestDefinida() {
        return questDefinida;
    }

    public void setQuestDefinida(boolean questDefinida) {
        this.questDefinida = questDefinida;
    }
}
